﻿using System.Collections.Generic;
using System.Linq;
using Utility.Persistence_Service;
using Utility.Persistence_Service.Implementations;

namespace Application_Core.Kunde_Component.Data_Access_Layer.Implementations
{
    internal class KundeRepositoryImpl : RepositoryImpl<Kunde>, KundeRepository
    {
        public KundeRepositoryImpl(UnitOfWork unitOfWork)
            : base(unitOfWork) { }

        /// <summary>
        /// Gibt den Kunden der gegebenen Kundennummer zurück.
        /// </summary>
        /// <param name="kundennummer">Kunden-Nummer</param>
        /// <returns>Kunde | null</returns>
        public Kunde FindByNummer(int kundennummer)
        {
            return (from k in this.unitOfWork.Query<Kunde>() where k.Nummer == kundennummer select k)
                .FirstOrDefault() ?? null;
        }

        /// <summary>
        /// Gibt alle Kunden mit gegebenen Nachnamen zurück.
        /// </summary>
        /// <param name="nachname">Kunden-Nachname</param>
        /// <returns>List<Kunde></returns>
        public List<Kunde> FindByNachname(string nachname)
        {
            return (from k in this.unitOfWork.Query<Kunde>() where k.Nachname == nachname select k)
                .ToList();
        }

        /// <summary>
        /// Gibt den technischen Schlüssel eines Kunden anhand der gegebenen Kundennummer zurück.
        /// </summary>
        /// <param name="kundennummer">Kunden-Nummer</param>
        /// <returns>KundeId | null</returns>
        public int? FindIdByNummer(int kundennummer)
        {
            int? kundeId = null;
            Kunde kunde = this.FindByNummer(kundennummer);
            if (kunde != null)
            {
                kundeId = kunde.Id;
            }
            return kundeId;
        }
    }
}
